package rui.game.position;

import javax.swing.*;

import static rui.game.rendering.MyColor.changeColor;
import static rui.game.RandomRule.SjsRule;

/**
 * 位置
 */
public class PositionRule {
    protected JButton[][] btnary;

    protected JLabel jLabel;

    /**
     * 分数
     */
    protected int count = 0;

    protected int num, a = 5;

    public PositionRule(JButton[][] btnary, JLabel jLabel) {
        this.btnary = btnary;
        this.jLabel = jLabel;
    }


    public void rule() {


        int f = checkBtn();
        inform(f);
    }

    /**
     * 判断 按钮中存在空白。
     */
    private int checkBtn() {
        // 防止所有按钮都有数字还会产生随机数的方法
        // 循环判断还有没有空，如果有就会执行随机数的方法
        int f = 0;
        for (int a = 0; a < 4; a++) {
            for (int b = 0; b < 4; b++) {
                if ("".equals(btnary[a][b].getText())) {
                    f++;
                }

            }
        }
        return f;
    }

    public void row() {
        for (int i = 0; i < 4; i++) {
            a = 5;
            for (int k = 0; k < 3; k++) {
                for (int j = 1; j < 4; j++) {
                    String str = btnary[i][j].getText(); // 获取当前方块按钮字符串
                    String str1 = btnary[i][j - 1].getText(); // 获取当前左1方块按钮字符
                    if (str1.equals("")) { // 如果左1方块文本为空字符
                        btnary[i][j + 1].setText(str); // 字符左移
                        btnary[i][j].setText(""); // 当前方块字符置空
                    } else if (str.equals(str1) && (j != a) && (j != a - 1)) {// 如果当前方块和左1方块文本字符相等
                        count(str);
                        str = String.valueOf(2 * num);// str等于（把整2*num形—字符串）
                        btnary[i][j - 1].setText(str); // 左1方块文本字符变为两方块之和
                        btnary[i][j].setText(""); // 当前方块字符置空
                        a = j;
                    }
                }
            }
        }
       rule();
    }

    /**
     * 分数统计
     */
    protected void count(String str) {
        num = Integer.parseInt(str);
        count += num;// 记分count=count+num
        String score = String.valueOf(count + count);// 将整形转化为字符串 //TODO ?为啥*2
        jLabel.setText(score);// 把字符串fenshu给Labelcount标签
    }


    /**
     *  TODO 后期使用 通知模式
     */
    public void inform(int f){
        if (f > 0) {
            SjsRule(btnary);
        }
        changeColor(btnary);

    }

    //本质上不就是坐标移动吗
    public void move(){

    }


    //TODO 首先合并，left 和 right 的操作
    public static class Left extends PositionRule {

        public Left(JButton[][] btnary, JLabel Labelcount) {
            super(btnary, Labelcount);
        }

        // ===移动的方法============================================================================
        // 从左边的第二位开始获取值，并获取左边-1的值然后再比较
        public void LeftRule() {
            for (int i = 0; i < 4; i++) {
                a = 5;
                for (int k = 0; k < 3; k++) {
                    for (int j = 1; j < 4; j++) {
                        String str = btnary[i][j].getText(); // 获取当前方块按钮字符串
                        String str1 = btnary[i][j - 1].getText(); // 获取当前左1方块按钮字符
                        if (str1.equals("")) { // 如果左1方块文本为空字符
                            btnary[i][j - 1].setText(str); // 字符左移
                            btnary[i][j].setText(""); // 当前方块字符置空
                        } else if (str.equals(str1) && (j != a) && (j != a - 1)) {// 如果当前方块和左1方块文本字符相等
                            count(str);
                            str = String.valueOf(2 * num);// str等于（把整2*num形—字符串）
                            btnary[i][j - 1].setText(str); // 左1方块文本字符变为两方块之和
                            btnary[i][j].setText(""); // 当前方块字符置空
                            a = j;
                        }
                    }
                }
            }
            rule();
        }
    }




    public static class Right extends PositionRule {

        public Right(JButton[][] btnary, JLabel Labelcount) {
            super(btnary, Labelcount);
        }


        // 右与左相反从右边第二个开始比较循环比较每次比较右边的一位+1；
        public void RightRule() {

            for (int i = 0; i < 4; i++) {
                a = 5;
                for (int k = 0; k < 3; k++) {
                    for (int j = 2; j >= 0; j--) {
                        String str = btnary[i][j].getText();
                        String str1 = btnary[i][j + 1].getText();
                        if (str1.equals("")) {
                            btnary[i][j + 1].setText(str);

                            btnary[i][j].setText("");

                        } else if (str.equals(str1) && j != a && j != a + 1) {
                            count(str);
                            str = String.valueOf(2 * num);
                            btnary[i][j + 1].setText(str);

                            btnary[i][j].setText("");
                            a = j;
                        }
                    }
                }
            }
            rule();
        }
    }


    public static class Up extends PositionRule {
        public Up(JButton[][] btnary, JLabel Labelcount) {
            super(btnary, Labelcount);
        }

        // 获取上面第二个位置的值，然后在获取的位置上向上-1
        // 然后再判断上一个按钮为不为空如果为空就把位置-1的值给上一个按钮并设置原按钮为空
        // 最后再比较相等就相加，并把获取的位置设置为空
        public void UpRule() {
            for (int j = 0; j < 4; j++) {
                a = 5;
                for (int k = 0; k < 3; k++) {
                    for (int i = 1; i < 4; i++) {
                        String str = btnary[i][j].getText();
                        String str1 = btnary[i - 1][j].getText();
                        if (str1.equals("")) {
                            btnary[i - 1][j].setText(str);

                            btnary[i][j].setText("");

                        } else if (str.equals(str1) && i != a && i != a - 1) {
                            count(str);
                            str = String.valueOf(2 * num);
                            btnary[i - 1][j].setText(str);

                            btnary[i][j].setText("");
                            a = i;
                        }
                    }
                }
            }
            rule();
        }
    }


    public static class Down extends PositionRule {

        public Down(JButton[][] btnary, JLabel Labelcount) {
            super(btnary, Labelcount);
        }

        // 获取下面第二个位置的值，然后再获取位置向下+1的值，
        // 如果向下位置+1的值为空就把第二个位置的值给向下+1位置的值，设置第二个位置的值为空
        // 如果不为空并且相等就相加
        public void DownRule() {

            for (int j = 0; j < 4; j++) {
                a = 5;
                for (int k = 0; k < 5; k++) {
                    for (int i = 2; i >= 0; i--) {
                        String str = btnary[i][j].getText();
                        String str1 = btnary[i + 1][j].getText();
                        // System.out.println("当前" + i + "+" + j);
                        // System.out.println("str" + str);
                        // System.out.println("前一个" + (i+1) + "+" + j );

                        // System.out.println("strA" + str1);

                        if (str1.equals("")) {
                            btnary[i + 1][j].setText(str);

                            btnary[i][j].setText("");

                        } else if (str.equals(str1) && i != a && i != a + 1) {
                            count(str);
                            str = String.valueOf(2 * num);
                            btnary[i + 1][j].setText(str);

                            btnary[i][j].setText("");
                            a = i;
                        }
                    }
                }
            }
            rule();
        }
    }

}

